#include "storage_system.h"
#include "storage.h"
#include "cache_manager.h"
#include "disk_io.h"
#include "storage_system.h" 
#include <string.h>
#include <stdio.h>

// 声明外部全局变量
extern char* data_directory; 
extern cache_manager_t* cache_manager;

// 分配新页
// 修改页分配函数，失败时返回UINT32_MAX而非0
page_id_t storage_alloc_page() {
    return allocate_page();  // 直接返回allocate_page的结果，失败时为UINT32_MAX
}

// 释放页
int storage_free_page(page_id_t pid) {
    // 检查页面ID是否有效（0和UINT32_MAX都是无效的页面ID）
    if (pid == 0 || pid == UINT32_MAX) {
        return -1;
    }
    
    storage_error_t result = free_page(pid);
    return (result == STORAGE_OK) ? 0 : -1;
}

// 读取页
// 修改storage_read_page函数，增强错误处理
int storage_read_page(page_id_t pid, Page *out) {
    if (!out) {
        return -1;
    }
    
    // 确保缓冲区被正确清空
    memset(out->data, 0, PAGE_SIZE);
    
    storage_error_t result = get_page(pid, out->data);
    
    if (result != STORAGE_OK) {
        // 增加错误类型判断
        switch(result) {
            case STORAGE_ERROR_NOT_FOUND: fprintf(stderr, "ERROR: Page %u not found\n", pid); break;
            case STORAGE_ERROR_IO: fprintf(stderr, "ERROR: I/O error reading page %u\n", pid); break;
            case STORAGE_ERROR_MEMORY: fprintf(stderr, "ERROR: Memory error reading page %u\n", pid); break;
            case STORAGE_ERROR_CATALOG: fprintf(stderr, "ERROR: Catalog error accessing page %u\n", pid); break; // 添加目录错误处理
            default: fprintf(stderr, "ERROR: Unknown error reading page %u\n", pid);
        }
        return -1;
    }
    
    return 0;
}

// 修改storage_write_page函数，增强错误处理
int storage_write_page(page_id_t pid, const Page* in) {
    if (!in) {
        fprintf(stderr, "ERROR: storage_write_page: NULL input buffer\n");
        return -1;
    }
    
    // 检查页面ID是否有效（0和UINT32_MAX都是无效的页面ID）
    if (pid == 0 || pid == UINT32_MAX) {
        fprintf(stderr, "ERROR: storage_write_page: Invalid page ID %u\n", pid);
        return -1;
    }

    // 使用临时缓冲区处理对齐问题
    uint8_t temp_buf[PAGE_SIZE];
    memset(temp_buf, 0, PAGE_SIZE); // 先清零，避免未初始化的数据
    memcpy(temp_buf, in->data, PAGE_SIZE);
    
    storage_error_t result = write_page(pid, temp_buf);
    if (result != STORAGE_OK) {
        fprintf(stderr, "ERROR: storage_write_page failed with code %d\n", result);
        return -1;
    }
    
    // 刷新缓存
    flush_page(pid);
    
    return 0;
}
